/**
 * 项目名称: 单循环链表.cpp
 * 项目路径: study/DataStructure/数据结构/循环链表
 * 编辑时间: 2024年07月08日20时33分04秒
 * 用   户: 轻尘
 */

/**
 * 单循环链表和单链表不同点
 *  1. 链表终止条件不同,链表结尾节点的next指向头节点,此时为链表结尾
 *  2. 第一个节点插入的时候,先让head节点指向新节点
 */

#include <bits/stdc++.h>

using namespace std;

struct Node {
    int data;
    Node *next;
};

Node *head = nullptr;

/**
 * 尾插法
 * @param value
 */
void add(int value) {
    Node *node = new Node;
    node->data = value;
    if (!head) {
        head = node;
        node->next = head;
    } else {
        Node *tmp = head;
        while (tmp->next != head)tmp = tmp->next;
        tmp->next = node;
        node->next = head;
    }
}

/**
 * 清空链表
 */
void clear() {
    Node *curr = head;
    Node *tmp;
    while (curr) {
        tmp = curr->next;
        delete curr;
        curr = tmp;
        if (tmp == head)break;
    }
    head = nullptr;
}

void print() {
    if (!head)return;
    Node *curr = head;
    for (Node *p = head;; p = p->next) {
        cout << p->data << " ";
        if(p->next == head)break;
    }
}

int main() {
    add(1);
    add(2);
    add(3);
    print();
    clear();
    print();
    return 0;
}
